/*-------------------------------------------------------------------------
 *
 * toast_compression.h
 *	  用于 toast 压缩的函数。
 *
 * Copyright (c) 2021-2022, PostgreSQL Global Development Group
 *
 * src/include/access/toast_compression.h
 *
 *-------------------------------------------------------------------------
 */

#ifndef TOAST_COMPRESSION_H
#define TOAST_COMPRESSION_H

/*
 * GUC 支持。
 *
 * default_toast_compression 是 GUC 机制的一个整数，但其值是下面定义的字符值之一，如它们出现在
 * pg_attribute.attcompression 中，例如 TOAST_PGLZ_COMPRESSION。
 */
extern PGDLLIMPORT int default_toast_compression;

/*
 * 内置压缩方法 ID。toast 压缩头将把
 * 这个存储在原始长度的前 2 位。这些内置压缩
 * 方法 ID 直接映射到内置压缩方法。
 *
 * 不要将这些值用于理解 varlena 的原始位的含义以外的任何目的；特别是，如果目标是识别
 * 一种压缩方法，请使用下面的常量 TOAST_PGLZ_COMPRESSION 等。
 * 我们可能某天会支持超过 4 种压缩方法，但
 * 由于存储此信息的地方只有 2 位可用，因此我们无法在此枚举中有超过 4 个值。
 */
typedef enum ToastCompressionId
{
	TOAST_PGLZ_COMPRESSION_ID = 0,
	TOAST_LZ4_COMPRESSION_ID = 1,
	TOAST_INVALID_COMPRESSION_ID = 2
} ToastCompressionId;

/*
 * 内置压缩方法。pg_attribute 将这些存储在
 * attcompression 列中。在 attcompression 中，InvalidCompressionMethod
 * 表示默认行为。
 */
#define TOAST_PGLZ_COMPRESSION			'p'
#define TOAST_LZ4_COMPRESSION			'l'
#define InvalidCompressionMethod		'\0'

#define CompressionMethodIsValid(cm)  ((cm) != InvalidCompressionMethod)


/* pglz 压缩/解压缩例程 */
extern struct varlena *pglz_compress_datum(const struct varlena *value);
extern struct varlena *pglz_decompress_datum(const struct varlena *value);
extern struct varlena *pglz_decompress_datum_slice(const struct varlena *value,
												   int32 slicelength);

/* lz4 压缩/解压缩例程 */
extern struct varlena *lz4_compress_datum(const struct varlena *value);
extern struct varlena *lz4_decompress_datum(const struct varlena *value);
extern struct varlena *lz4_decompress_datum_slice(const struct varlena *value,
												  int32 slicelength);

/* 其他内容 */
extern ToastCompressionId toast_get_compression_id(struct varlena *attr);
extern char CompressionNameToMethod(const char *compression);
extern const char *GetCompressionMethodName(char method);

#endif							/* TOAST_COMPRESSION_H */
